package com.ponhu.ea2.stockcenter.provider.support.enums;

/**
 * 库存变动内部处理事件（影响销售层）
 * 备注：只有实物层事件处理影响销售层可售数、占用数的情况才会响应
 */
public enum StockChangeInnerEventEnum {
    /**
     * 1开头为OMS系统使用
     */
    /*
        销售层库存响应：占用++
     */
    SALES_ORDER(10101, "销售下单", "销售下单-占用库存"),

    /*
        销售层库存响应：占用--
     */
    CANCEL_SALES_ORDER(10201, "取消销售单", "取消销售单-释放库存"),

    /**
     * 2开头为WMS系统使用
     */

    /*
        流程：二奢----养护----中检----收发仓
        场景：OMS下单成功后，wms将货品从二奢(可售)调拨到养护仓(不可售)，其间发生的调拨申请(存在销售单占用库存的情况)
        销售层库存响应：可售--，占用--
     */
    TRANSFER_APPLY_OCCUPY(20001, "调拨申请(存在占用)", "调拨申请(存在占用)"),

    /*
        流程：二奢----养护----中检----收发仓
        场景：货品在库养护，wms将货品从二奢(可售)调拨到养护(不可售)，其间发生的调拨申请(不存在销售单占用库存的情况)
        销售层库存响应：可售--
     */
    TRANSFER_APPLY_NO_OCCUPY(20002, "调拨申请(不存在占用)", "调拨申请(不存在占用)"),

    /*
        流程：二奢----养护----中检----收发仓
        场景：OMS下单，二奢调拨申请到养护，然后WMS发起取消调拨申请
     */
    CANCEL_TRANSFER_APPLY_AND_DOC_NO_CANCELED(21101, "取消调拨申请(存在占用并且原调拨申请从可售到不可售并且订单未取消)", "取消调拨申请(存在占用并且原调拨申请从可售到不可售并且订单未取消)"),

    /*
        流程：二奢----养护
        场景：在库养护，二奢调拨申请到养护，然后WMS发起取消调拨申请（从可售到不可售）
     */
    CANCEL_TRANSFER_APPLY_AND_NO_DOC_NO_AND_YES_TO_NO(21102, "取消调拨申请(不存在占用并且原调拨申请从可售到不可售)", "取消调拨申请(不存在占用并且原调拨申请从可售到不可售)"),

    /*
        流程：收发仓----二奢仓
        场景：wms将货品从收发仓(不可售)调拨到二奢仓(可售)，其间发生的调拨申请、调拨出库，最后走调拨入库
        销售层库存响应：可售++
     */
    TRANSFER_IN_SALES_WAREHOUSE(20201, "调拨入库(调拨到可售仓)", "调拨入库(调拨到可售仓)"),

    /*
        流程：采购入库----标品仓
        场景：采购入库，直接入标品仓
        销售层库存响应：可售++
     */
    PURCHASE_IN_SALES_WAREHOUSE(20601, "采购入库(采购入可售仓)", "采购入库(采购入可售仓)"),

    /*
        流程：采购入库----标品仓----取消采购入库
        场景：采购入库，直接入标品仓，然后发起取消采购入库
        销售层库存响应：实物类可售--，虚拟类可售++
     */
    CANCEL_PURCHASE_IN_SALES_WAREHOUSE(21201, "取消采购入库(取消采购入可售仓)", "取消采购入库(取消采购入可售仓)"),

    /*
        流程：二奢仓(可售)----收发仓
        场景：采退申请成功，采退出库事件发起。
        销售层库存响应：可售--
     */
    PURCHASE_RETURN_OUT_OF_SALES_WAREHOUSE_OCCUPY(20501, "采退出库(采退出可售仓，有占用)", "采退出库(采退出可售仓，有占用)"), // 可售--，占用--

    PURCHASE_RETURN_OUT_OF_SALES_WAREHOUSE(20502, "采退出库(采退出可售仓，无占用)", "采退出库(采退出可售仓，无占用)"), // 可售--


    /*
        场景：二奢仓(可售)货品损坏
        销售层库存响应：可售--
     */
    CHECK_LOSS_OUT_OF_SALES_WAREHOUSE(20701, "盘亏出库(盘亏出可售仓)", "盘亏出库(盘亏出可售仓)"),

    /*
        场景：二奢仓(可售)货品多了一件
        销售层库存响应：可售++
     */
    CHECK_PROFIT_IN_SALES_WAREHOUSE(20801, "盘盈入库(盘盈入可售仓)", "盘盈入库(盘盈入可售仓)"),


    /*
        流程：标品仓 。不通过调拨申请等过程，直接从可售仓出库
        场景：当OMS下单成功后，直接从标品仓出库，视为销售出库(销售出可售仓，有占用)
     */
    SALES_OUT_OF_SALES_WAREHOUSE_OCCUPY(20301, "销售出库(销售出可售仓，有占用)", "销售出库(销售出可售仓，有占用)"), // 可售--，占用--
    SALES_OUT_OF_UNSALES_WAREHOUSE_OCCUPY(20302, "销售出库(销售出不可售仓，有占用)", "销售出库(销售出不可售仓，有占用)"), // 可售不变，占用--

    /*
        场景：销退入库 ---- 标品仓(可售)
        销售层库存响应：可售++
     */
    SALES_RETURN_IN_SALES_WAREHOUSE(20401, "销退入库(销退入可售仓)", "销退入库(销退入可售仓)"),

    /*
        场景：销退入库 ---- 标品仓(可售) ---- 取消销退入库
        销售层库存响应：可售--
     */
    CANCEL_SALES_RETURN_IN_SALES_WAREHOUSE(21301, "取消销退入库(取消销退入可售仓)", "取消销退入库(取消销退入可售仓)"),

    /*
        场景：二奢仓(可售)货品出库
        销售层库存响应：可售--
     */
    OTHER_OUT_SALES_WAREHOUSE(21001, "其他出库(出可售仓)", "其他出库(出可售仓)"), // 可售--

    /*
        场景：二奢仓(可售)货品入库
        销售层库存响应：可售++
     */
    OTHER_IN_SALES_WAREHOUSE(20901, "其他入库(入可售仓)", "其他入库(入可售仓)"), // 可售++

    /**
     * 3开头为采购中心使用
     */
    PURCHASE_RETURN_APPLY(30101, "采购退货申请", "采购退货申请"),


    CANCEL_PURCHASE_RETURN_APPLY(30201, "取消采购退货申请", "取消采购退货申请"),

    /**
     * 4开头为商品中心
     */
    ADD_VIRTUAL_SALES_STOCK(40101, "云商商品上架：增加1个虚拟可售数", "云商商品上架：增加1个虚拟可售数"),

    DELETE_VIRTUAL_SALES_STOCK(40201, "云商商品下架：减少1个虚拟可售数", "云商商品下架：减少1个虚拟可售数"),

    /**
     * 9开头为系统修复
     */
    SALES_OUT_OF_SYSTEM_FIX(90101, "销售出库(系统修复)", "销售出库(系统修复)"),
    PURCHASE_RETURN_OUT_OF_SYSTEM_FIX(90301, "采退出库(系统修复)", "采退出库(系统修复)"),
    PURCHASE_RETURN_CANCEL_OF_SYSTEM_FIX(90302, "取消采退申请(系统修复)", "取消采退申请(系统修复)");

    private Integer code;

    private String name;

    private String remark;

    StockChangeInnerEventEnum(Integer code, String name, String remark) {
        this.code = code;
        this.name = name;
        this.remark = remark;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static String getName(Integer code) {
        for (StockChangeInnerEventEnum c : StockChangeInnerEventEnum.values()) {
            if (code.equals(c.getCode())) {
                return c.name;
            }
        }
        return null;
    }

    public static String getRemark(Integer code) {
        for (StockChangeInnerEventEnum c : StockChangeInnerEventEnum.values()) {
            if (code.equals(c.getCode())) {
                return c.remark;
            }
        }
        return null;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}
